package com.example.mytest.annotation4;

import org.springframework.core.annotation.AliasFor;
import org.springframework.test.context.ContextConfiguration;

/**
 * @ClassName: TransactionalService
 * @Description: TODO 元注解属性的显性别名,用于部分继承
 * @Author: 230689
 * @Date: 2021/9/8 17:06
 * @Version: v1.0
 */
@ContextConfiguration
public @interface MyTestConfig {

    // TODO: 实际上，使用@AliasFor甚至可以为元注解的value属性声明别名.
    //  如下所示：@MyTestConfig下的xmlFiles指向的是一个元注解@ContextConfiguration的属性locations
    @AliasFor(annotation = ContextConfiguration.class, attribute = "locations")
    String[] xmlFiles();
}

//   2.用于元注解属性的显性别名
//        如果被@AliasFor注释的属性指向的是它所在注解之外的其他注解，那么这个属性被解释成元注解属性的别名。(称之为显性的元注解属性重写)
//        我们可以通过重写继承一个或多个其他注解的功能从而使得可以更细粒度精准地控制注解层级中属性的重写,
//        不像Java中继承必须继承父类的所有功能。


//实现要求:
//        1 如果一个属性是一个元注解属性的别名,那么这个属性必须用@AliasFor进行注释并且该属性必须指向元注解属性。
//        2 别名化的属性必须声明相同的返回结果
//        3.@AliasFor的annotation属性必须引用元注解
//4.被引用的元注解必须放置在声明了@AliasFor的注解类上